package fiuba.algo3.usuario;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


// En el programa se usa UsuariosExistentes, que indirectamente usa esta clase.
// Tiene que ser publica de todas formas, para permitir la persistencia personalizada, 
// que facilita la lectura y la edicion manual.

public class Usuario {

	private String nombre;
	private int puntajeMaximo;
	
	// usado unicamente para instanciar los comparadores desde clases cercanas
	Usuario(){
		
	}
	
	public Usuario(String nombre){
		this.nombre = nombre.toUpperCase();
		puntajeMaximo = 0;
	}
	
	public void recalcularPuntajeMaximo(int nuevoPuntaje){
		if (puntajeMaximo < nuevoPuntaje) puntajeMaximo = nuevoPuntaje;
	}
	
	public String getNombre(){
		return nombre;
	}
	
	public int getPuntajeMaximo(){
		return puntajeMaximo;
	}
	
	public Comparator<Usuario> getComparadorAlfabetico(){
		return new ComparadorPorNombreDeUsuario();
	}
	
	public Comparator<Usuario> getComparadorPorPuntaje(){
		return new ComparadorPorPuntajeMaximoDeUsuario();
	}
	
	
	
	
	private class ComparadorPorNombreDeUsuario implements Comparator<Usuario>{

		@Override
		public int compare(Usuario unUsuario, Usuario otroUsuario) {
			if (unUsuario.getNombre().equals(otroUsuario.getNombre())) return 0;
			
			List<String> nombres = new ArrayList<String>();
			nombres.add(unUsuario.getNombre());
			nombres.add(otroUsuario.getNombre());
			Collections.sort(nombres, String.CASE_INSENSITIVE_ORDER);
			
			if (nombres.get(0) == unUsuario.getNombre()) return -1;	// unUsuario esta antes alfabeticamente
			return +1;
		}
	}
	
	
	private class ComparadorPorPuntajeMaximoDeUsuario implements Comparator<Usuario>{
		@Override
		public int compare(Usuario unUsuario, Usuario otroUsuario) {
			if (unUsuario.getPuntajeMaximo() > otroUsuario.getPuntajeMaximo()) return +1;
			if (unUsuario.getPuntajeMaximo() == otroUsuario.getPuntajeMaximo()) return 0;
			return -1;
		}
	}
}
